package com.hzw.saas.api.hpc;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.saas.api.hpc.bo.HpcAccountCountBo;
import com.hzw.saas.api.hpc.bo.HpcAccountUserBo;
import com.hzw.saas.api.hpc.bo.HpcAccountUsersBo;
import com.hzw.saas.api.hpc.bo.HpcSharedRecordBO;
import com.hzw.saas.api.hpc.enums.HpcProviderType;
import com.hzw.saas.api.hpc.query.*;
import com.hzw.saas.api.user.bo.CustomerBO;
import com.hzw.saas.common.config.util.PageParam;

import java.util.List;

/**
 * <p>
 * 用户超算中心帐号表 服务类
 * </p>
 *
 * @author zzl
 * @since 2021-02-03
 */
public interface IHpcAccountUserService {

    /**
     * 初始化用户数据
     */
    void initHpcUserData(String hpcAccountUserId);

    /**
     * 获取超算帐号连带Record信息
     * @param accountUserId
     * @return
     */
    HpcAccountUserBo getWithRecord(String accountUserId);

    /**
     * 获取超算帐号
     * @param accountUserId
     * @return
     */
    HpcAccountUserBo get(String accountUserId);

    /**
     * 获取超算帐号
     * @param userId
     * @param hpcAccountId
     * @return
     */
    HpcAccountUserBo get(String userId, String hpcAccountId);

    /**
     * 获取
     * @param accountRecordId
     * @return
     */
    HpcAccountUserBo getMainUserByRecordId(String accountRecordId);

    /**
     * 获取用户所有超算帐号列表
     * @param userId
     * @return
     */
    List<HpcAccountUserBo> getList(String userId);

    /**
     * 查询账户下所有共享给自己的HPC账号的用户列表（user_id、customer_level）
     * @param userId
     * @return
     */
    List<CustomerBO> listMainSharedCustomers(String userId);

    /**
     * 获取用户所有超算帐号列表
     * @param pageParam
     * @param userId
     * @param isMain  是否为主账号
     * @param isExpire 是否过期，可以为空，为空则查全部
     * @return
     */
    IPage<HpcAccountUserBo> getUsableListByUserIdPage(PageParam pageParam, String userId, Integer isMain, Boolean isExpire);

    /**
     * 获取有效的HPC账号列表
     * @param hpcAccountUserIds
     * @return
     */
    List<HpcAccountUserBo> getUsableHpcAccountUserList(List<String> hpcAccountUserIds);

    /**
     * 统计所有帐号机时剩余量
     *
     * @param userId
     * @return
     */
    double sumHpcAccountBalance(String userId);

    /**
     * 增加超算主账号
     * @param mainHpcAccountQuery
     * @return
     */
    HpcAccountUserBo addMainAccountUser(MainHpcAccountQuery mainHpcAccountQuery);

    /**
     * 获取子账号数量
     * @param hpcAccountUserId
     * @return
     */
    int countSub(String hpcAccountUserId);

    /**
     * 增加子账号
     * @param subHpcAccountQueries
     * @return
     */
    void addSubAccountUser(List<SubHpcAccountQuery> subHpcAccountQueries);

    /**
     * 取消共享账户
     * @param hpcAccountUserId
     * @param userId
     */
    void cancelShareHpcAccount(String hpcAccountUserId, String userId);

    /**
     * 冻结超算帐号
     * @param hpcAccountUserFrozenQuery
     * @return
     */
    boolean frozenHpcAccount(HpcAccountUserFrozenQuery hpcAccountUserFrozenQuery);

    /**
     * 通用的更新
     * @param hpcAccountUserBo
     */
    boolean update(HpcAccountUserBo hpcAccountUserBo);

    /**
     * 指定字段更新
     * @param hpcAccountUserUpdateQuery
     */
    boolean update(HpcAccountUserUpdateQuery hpcAccountUserUpdateQuery);

    /**
     * 更新userId、是slurmAccount、expireTime
     * @param hpcAccountUserUpdateQuery
     */
    boolean update(HpcQCloudUpdateQuery hpcAccountUserUpdateQuery);

    /**
     * 删除超算帐号
     * @param accountUserId
     * @return
     */
    boolean delete(String accountUserId);

    /**
     * 获取指定用户绑定的超算数量
     * @param userId
     * @return
     */
    HpcAccountCountBo getHpcAccountCountByUserId(String userId);

    /**
     * 解绑HPC帐号
     * @param hpcAccountUserId
     * @param force 是否强制解绑
     */
    void unBoundHpcAccount(String hpcAccountUserId, boolean force);

    /**
     * 获取主账户冻结的帐号数量
     * @return
     */
    int getFreezeCount(HpcProviderType hpcProviderType);

    /**
     *  通过hpcAccountRecordId,获取对应的HPC-User
     * @return
     */
    List<HpcAccountUserBo> getListByHpcAccountRecordId(String hpcAccountRecordId);

    /**
     * 通过hpcAccountRecordId,获取对应的共享HPC-User
     * @param hpcAccountRecordId
     * @return
     */
    List<HpcAccountUserBo> getShareListByHpcAccountRecordId(String hpcAccountRecordId);

    /**
     * 冻结所有已过期的
     */
    void frozenAll();

    /**
     * 通过recordId删除hpcAccountUser
     * @param hpcAccountRecordId
     */
    void deleteByRecordId(String hpcAccountRecordId);

    /**
     * 通过用户ID列表，查询HPC账号
     * @param userId
     * @return
     */
    List<HpcAccountUsersBo> findHpcAccountUsers(List<String> userId);

    /**
     * 通过用户ID获取需要可分享的客户列表
     * @param pageParam
     * @param userId
     * @param hpcAccountUserId
     * @param fuzzy
     * @return
     */
    IPage<CustomerBO> listNeedShareCustomerByUserId(PageParam pageParam, String userId, String hpcAccountUserId, String fuzzy, String keyword);

    /**
     * 通过用户ID获取需要已分享的客户列表
     * @param pageParam
     * @param userId
     * @param hpcAccountUserId
     * @param fuzzy
     * @return
     */
    IPage<CustomerBO> listShareCustomerByUserId(PageParam pageParam, String userId, String hpcAccountUserId, String fuzzy, String keyword);

    IPage<HpcSharedRecordBO> listShardHpcRecord(PageParam pageParam, String hpcAccountUserId);
    IPage<HpcSharedRecordBO> listSubShardHpcRecord(PageParam pageParam, String hpcAccountUserId, String userId);
}
